package cn.iocoder.yudao.module.train.dal.mysql.staff;

import java.util.*;

import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.module.train.controller.admin.teacher.vo.TeacherPageReqVO;
import cn.iocoder.yudao.module.train.dal.dataobject.WxUser.WxUserDO;
import cn.iocoder.yudao.module.train.dal.dataobject.connectDTO.StaffUserDTO;
import cn.iocoder.yudao.module.train.dal.dataobject.connectDTO.TeacherUserDTO;
import cn.iocoder.yudao.module.train.dal.dataobject.staff.StaffDO;
import cn.iocoder.yudao.module.train.dal.dataobject.student.StudentDO;
import cn.iocoder.yudao.module.train.dal.dataobject.teacher.TeacherDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import cn.iocoder.yudao.module.train.controller.admin.staff.vo.*;

/**
 * 工作人员用户 Mapper
 *
 * @author 芋道源码
 */
@Mapper
public interface StaffMapper extends BaseMapperX<StaffDO> {

//    default PageResult<StaffDO> selectPage(StaffPageReqVO reqVO) {
//        return selectPage(reqVO, new LambdaQueryWrapperX<StaffDO>()
//                .likeIfPresent(StaffDO::getStaffName, reqVO.getStaffName())
//                .eqIfPresent(StaffDO::getUserId, reqVO.getUserId())
//                .eqIfPresent(StaffDO::getStaffAge, reqVO.getStaffAge())
//                .eqIfPresent(StaffDO::getStaffSex, reqVO.getStaffSex())
//                .eqIfPresent(StaffDO::getStaffType, reqVO.getStaffType())
//                .betweenIfPresent(StaffDO::getCreateTime, reqVO.getCreateTime())
//                .orderByDesc(StaffDO::getId));
//    }

    default PageResult<StaffUserDTO> selectPage(StaffPageReqVO reqVO) {
        // 创建MyBatis-Plus分页对象
        Page<StaffUserDTO> page = new Page<>(reqVO.getPageNo(), reqVO.getPageSize());

        // 创建连接查询条件
        MPJLambdaWrapper<StaffDO> wrapper = new MPJLambdaWrapper<StaffDO>()
                .selectAll(StaffDO.class)
                .select(WxUserDO::getUName)
                .selectAs(WxUserDO::getId, StaffUserDTO::getUserId)
                .select(WxUserDO::getUOpenId)
                .select(WxUserDO::getUAvatar)
                .select(WxUserDO::getUStatus)
                .leftJoin(WxUserDO.class, on -> on
                        .eq(WxUserDO::getId, StaffDO::getUserId)
                );  // 连接条件

        // 添加与原方法相同的过滤条件
        if (reqVO.getStaffName() != null) {
            wrapper.like(StaffDO::getStaffName, reqVO.getStaffName());
        }
        if (reqVO.getStaffPhoneNumber() != null) {
            wrapper.like(StaffDO::getStaffPhoneNumber, reqVO.getStaffPhoneNumber());
        }
        if (reqVO.getStaffAge() != null) {
            wrapper.eq(StaffDO::getStaffAge, reqVO.getStaffAge());
        }
        if (reqVO.getStaffSex() != null) {
            wrapper.eq(StaffDO::getStaffSex, reqVO.getStaffSex());
        }
        if (reqVO.getCreateTime() != null && reqVO.getCreateTime().length == 2) {
            wrapper.between(StudentDO::getCreateTime, reqVO.getCreateTime()[0], reqVO.getCreateTime()[1]);
        }
        if (reqVO.getStaffType() != null) {
            wrapper.eq(StaffDO::getStaffType, reqVO.getStaffType());
        }
        if (reqVO.getStaffBirthdate() != null && reqVO.getStaffBirthdate().length == 2) {
            wrapper.between(StaffDO::getStaffBirthdate, reqVO.getStaffBirthdate()[0], reqVO.getStaffBirthdate()[1]);
        }
        // 处理 u_status 条件 - 要考虑 wx_user 为 null 的情况
        if (reqVO.getUStatus() != null) {
            wrapper.and(w -> w
                    .isNull(WxUserDO::getId)  // wx_user 不存在的情况
                    .or()
                    .eq(WxUserDO::getUStatus, reqVO.getUStatus())  // wx_user 存在且 status 匹配
            );
        }

        // 处理 u_role 条件 - 要考虑 wx_user 为 null 的情况
        wrapper.and(w -> w
                .isNull(WxUserDO::getId)  // wx_user 不存在的情况
                .or()
                .eq(WxUserDO::getURole, 2)  // wx_user 存在且 role = 1
        );
        wrapper.orderByDesc(StaffDO::getId);

        // 执行连接查询并分页
        IPage<StaffUserDTO> resultPage = selectJoinPage(page, StaffUserDTO.class, wrapper);

        // 转换为框架的PageResult
        return new PageResult<>(resultPage.getRecords(), resultPage.getTotal());
    }

    default StaffUserDTO selectStaffUser(Integer id) {
        return selectJoinOne(StaffUserDTO.class,
                new MPJLambdaWrapper<StaffDO>()
                        .selectAll(StaffDO.class)
                        .leftJoin(WxUserDO.class, WxUserDO::getId, StaffDO::getUserId)

                        // 关联表的列全部显式别名到 DTO 属性名（用“字符串别名”避免大小写问题）
                        .selectAs(WxUserDO::getId,           "uId")
                        .select(WxUserDO::getUOpenId)
                        .select(WxUserDO::getUName)
                        .select(WxUserDO::getUAvatar)
                        .select(WxUserDO::getUStatus)  // 关键：别名必须是 uStatus（小写u）

                        .eq(StaffDO::getId, id)
        );
    }
}
